package com.learn.BlockQueue;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;

/**
 * 1.阻塞队列可以在主线程中使用
 * 2.除了阻塞方法的存put无返回值  其他都有返回值
 * 3.add | remove 这套API方法会报错不论存取
 * 4.offer |  poll 的重载方法会有延时
 * 5.put | take 存取不一致都会阻塞
 */
public class BlockingQueueDemo {
    public static void main(String[] args) throws InterruptedException {
//        test1();
        //test2();
        //test3();
        test4();
    }

    /**
     * 会报错
     * add  添加
     * remove 取值  多取就报错
     * element 取队首
     */
    public static void test1(){
        BlockingQueue queue = new ArrayBlockingQueue(3);
        queue.add("A");
        queue.add("B");
        queue.add("C");
        System.out.println(queue);

        System.out.println("队首:"+queue.element());
        System.out.println(queue.remove());

        System.out.println("队首:"+queue.element());
        System.out.println(queue.remove());

        System.out.println("队首:"+queue.element());
        System.out.println(queue.remove());
        //多取会报错
        System.out.println(queue.remove());

    }
    /**
     * 不会报错  有返回值
     * offer 插入
     * poll  推出 多取会取出null值
     * peek  队首
     */
    public static void test2() throws InterruptedException {
        BlockingQueue queue = new ArrayBlockingQueue(3);
        queue.offer("A");
        queue.offer("B");
        queue.offer("C");
        System.out.println(queue);

        System.out.println("队首:"+queue.peek());
        System.out.println(queue.poll());

        System.out.println("队首:"+queue.peek());
        System.out.println(queue.poll());

        System.out.println("队首:"+queue.peek());
        System.out.println(queue.poll());

        //多取会取出null值
        System.out.println(queue.poll());
    }

    /**
     * 超时阻塞方法   若一段时间后不满足则结束阻塞
     * offer 指定时间后存入，不满足退出阻塞
     * poll  指定时间后推出，不满足返回null值
     * @throws InterruptedException
     */
    public static void test4() throws InterruptedException {
        BlockingQueue queue = new ArrayBlockingQueue(3);
        queue.offer("A");
        queue.offer("B");
        queue.offer("C");
        //多存少取无影响
        queue.offer("D",2, TimeUnit.SECONDS);
        System.out.println(queue);

        System.out.println(queue.poll());
        System.out.println(queue.poll());
        System.out.println(queue.poll());

        //多取会延时再取null
//        System.out.println(queue.poll(2,TimeUnit.SECONDS));
    }


    /**
     * 阻塞方法   不满足一直阻塞
     * put 存入  无返回值
     * take  取值 存取不一致 都会阻塞
     * @throws InterruptedException
     */
    public static void test3() throws InterruptedException {
        BlockingQueue queue = new ArrayBlockingQueue(3);
        queue.put("A");
        queue.put("B");
        queue.put("C");
        System.out.println(queue);

        System.out.println(queue.take());
        System.out.println(queue.take());
        System.out.println(queue.take());
        //存取不一致都会阻塞
        System.out.println(queue.take());
    }



}


